#ifndef MODELXML_H
#define MODELXML_H

#include "IModelData.h"
#include "pugixml/pugixml.hpp"
#include <map>
#include <string>
using namespace pugi;
class ModelXml //: public IModelData
{
private:
    static ModelXml* g_ModelXml;
    ModelXml();

public:
    static ModelXml* GetInstance();
    //添加工程
    void AddProject(stProject projectName);
    //返回工程
    stProject& GetProject();
    //***************************************采集通道******************************************//
    //添加采集通道
    int AddCollectChannel(stCollectChannel channel);
    //删除采集通道
    void DelCollectChannel(int channelID);
    //返回采集通道列表
    std::map<int, stCollectChannel> GetCollectChannel();
    std::map<int, stCollectChannel>* GetCollectChannelPointer();
    //根据ID返回对应的采集通道信息
    stCollectChannel GetCollectChannel(int channelID);
    //修改采集通道信息
    void ModiCollectChannel(stCollectChannel st);

    //添加设备
    int AddCollectDevice(int parentID, stCollecDevice device);
    //返回采集通道下的所有设备
    std::map<int, stCollecDevice> GetCollectDevice(int channelID);
    std::map<int, std::map<int, stCollecDevice>>* GetAllDevice();
    //返回单个设备信息
    stCollecDevice* GetCollectDevicePointer(int channelID, int deviceID);
    //慎用，该函数会产生新的另一份点表，只用做复制采集设备时调用，其它的时候，使用返回指针
    stCollecDevice GetCollectDevice(int channelID, int deviceID);
    //返回最大的ID
    int GetMaxCollectChannelID();
    //返回设备的已经用过的最大ID号
    int GetMaxCollectDeviceID(int channelID);
    //修改设备属性
    bool ModiCollectDevice(int channelID, stCollecDevice dev);
    //删除采集设备
    bool DelCollectDevice(int channelID, int devID);
    //***************************************转发通道******************************************//
    int GetMaxUpdateChannelID();
    void AddUpdateChannel(stUpdateChannel stChannel);
    bool DelUpdateChannel(int channelID);
    std::map<int, stUpdateChannel> GetUpdateChannelList();
    stUpdateChannel* GetUpdateChannelInfoPointer(int channelID);
    stUpdateChannel GetUpdateChannelInfo(int channelID);
    //保存为XML文件
    bool SaveXml();
    //打开工程文件
    bool OpenProjectFile(std::string pathXml);
    bool CloseProject();
    bool DeleteProject();

private:
    stProject m_project; //工程信息1
    int m_deviceNumber; //设备通道最大id
    std::map<int, stCollectChannel> m_collectChannel; //采集通道
    std::map<int, std::map<int, stCollecDevice>> m_collectDevice; //所属通道ID,设备ID,设备信息

    std::map<int, stUpdateChannel> m_updateChannel;
    pugi::xml_document m_doc;
};

#endif // MODELXML_H
